import 'package:dio/dio.dart';
import 'package:flutter_enjoy_plus/utils/event_bus.dart';
import 'package:flutter_enjoy_plus/utils/token.dart';

class NetworkService {
  final _dio = Dio();
  NetworkService() {
    //配置基地址
    _dio.options.baseUrl = 'https://live-api.itheima.net/';
    // 设置请求超时时间
    _dio.options.connectTimeout = const Duration(seconds: 5);
    // 设置响应超时时间
    _dio.options.receiveTimeout = const Duration(seconds: 5);
    //设置请求头
    _dio.options.headers = {'Content-Type': 'application/json'};
    //拦截器
    _addInterceptors();
  }

  //get请求
  //url请求地址
  //params查询参数
  Future get(String url, {Map<String, dynamic>? params}) async {
    try {
      final response = await _dio.get(url, queryParameters: params);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  //post请求
  //url 请求的地址
  //data 请求体数据

  Future post(String url, dynamic data) async {
    try {
      final response = await _dio.post(url, data: data);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  //delete请求
  //url 请求的地址
  Future delete(String url, {Map<String, dynamic>? params}) async {
    try {
      final response = await _dio.delete(url, queryParameters: params);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  //统一处理成功后的结果
  handleResponse(Response response) {
    if (response.statusCode! >= 200 && response.statusCode! < 300) {
      return response.data;
    } else {
      throw Exception('请求异常,状态码为${response.statusCode}');
    }
  }

  //统一处理失败后的结果
  handleError(error) {
    //判断error错误信息是否属于dio
    if (error is DioException) {
      if (error.type == DioExceptionType.connectionTimeout ||
          error.type == DioExceptionType.receiveTimeout) {
        throw Exception('连接超时');
      } else if (error.type == DioExceptionType.badResponse) {
        if (error.response?.statusCode == 401) {
          //清除token
          TokenManager().removeToken();
          //派发事件-跳转到登录页
          eventBus.fire(Logout());
        } else {
          throw Exception('响应错误');
        }
      } else {
        throw Exception('网络请求错误$error');
      }
    } else {
      throw Exception('未知错误,$error');
    }
  }

  // 拦截器
  _addInterceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          //携带token
          final token = TokenManager().getToken() ?? '';
          if (token.isNotEmpty) {
            options.headers['Authorization'] = 'Bearer $token';
          }
          return handler.next(options);
        },
        onResponse: (Response response, ResponseInterceptorHandler handler) {
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          return handler.next(response);
        },
        onError: (DioException error, ErrorInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          return handler.next(error);
        },
      ),
    );
  }
}

final http = NetworkService();
